/*
 * @Author: ray ray.chin@163.com
 * @Date: 2022-12-30 10:31:19
 * @LastEditors: ray ray.chin@163.com
 * @LastEditTime: 2023-01-03 14:02:52
 * @FilePath: /app-template-uni-upgrade/src/utils/storageHelper.js
 * @Description: 存储工具类
 * localStorage
    和cookie很类似，但是localStorage的大小有5M
    localStorage应用：存储一些需要刷新保存并且需要在页面关闭后仍然留下的信息。可以用于保存购物车中的内容；
    在之前项目中，用于保存上一次的用户浏览标签，并跳转到相应的路径下。
    localstorage注意事项：因为性能问题，不能过于依赖 JSON.stringify。value 尽量使用 string。
    如果需要多次写入localstorage，尽量一次性写入。localstorage是同步执行，可能会阻塞UI
 * sessionStorage
    sessionStorage的有效期仅存在于浏览器的标签页。也就是说如果关闭标签页后，通过sessionStorage存储的数据就都被删除了
    应用场景存储一些当前页面刷新需要存储，且不需要在tab关闭时候留下的信息。可以用来检测用户是否是刷新进入的页面，如音乐播放器恢复播放进度条的功能。非常适合单页应用程序，可以方便在各业务模块进行传值。
 * Copyright (c) 2022 by ray ray.chin@163.com, All Rights Reserved.
 */

/**
 * localStorage存储
 * @param {*} key 存储键
 * @param {*} value 存储值
 * @returns
 */
export function setLocalStorage(key, value) {
    if (!value) {
        try {
            uni.removeStorageSync(key);
        } catch (e) {
            // error
            window.localStorage.removeItem(key);
        }
        return;
    }
    let storageValue = (value.constructor == String) ? value : JSON.stringify(value);
    try {
        uni.setStorageSync(key, storageValue);
    } catch (e) {
        // error
        window.localStorage.setItem(key, storageValue);
    }
};

/**
 * localStorage读取
 * @param {*} key 存储键
 * @returns 存储数据内容
 */
export function getLocalStorage(key) {
    let o = "";
    try {
        o = uni.getStorageSync(key);
    } catch (e) {
        // error
        o = window.localStorage.getItem(key);
    }
    return o;
};

/**
 * localStorage清除
 * @returns
 */
export function clearLocalStorage() {
    try {
        uni.clearStorageSync();
    } catch (e) {
        // error
        window.localStorage.clear();
    }
};

/**
 * localStorage token存储
 * @param {*} key 存储键
 * @param {*} value token数据
 * @param {*} hours 有效时间
 * @returns
 */
export function setStorageToken(key, value, hours) {
    // 设置过期原则 Hours以小时为单位
    let Hours = hours || 2; // 默认保留2小时
    let exp = (new Date().getTime()) + Hours * 60 * 60 * 1000;
    let obj = {
        expires: exp,
        value: value
    }
    setLocalStorage(key, obj);
};

/**
 * localStorage token读取
 * @param {*} key 存储键
 * @returns token
 */
export function getStorageToken(key) {
    let o = getLocalStorage(key);
    if (
        !o
        || o.indexOf('expires') < 0
    ) {
        return "";
    }
    let obj = JSON.parse(o);
    if (obj.expires < (new Date().getTime())) {
        return "";
    }
    return obj.value;
};

/**
 * sessionStorage存储
 * @param {*} key 存储键
 * @param {*} value token数据
 * @returns
 */
export function setSessionStorage(key, value) {
    if (!value) {
        window.sessionStorage.removeItem(key);
        return;
    }
    let storageValue = (value.constructor == String) ? value : JSON.stringify(value);
    window.sessionStorage.setItem(key, storageValue);
};

/**
 * sessionStorage读取
 * @param {*} key 存储键
 * @returns 存储数据
 */
export function getSessionStorage(key) {
    let o = window.sessionStorage.getItem(key);
    return o;
};

/**
 * sessionStorage清除
 * @returns
 */
export function clearSessionStorage() {
    window.sessionStorage.clear();
};

/**
 * storage清除
 * @returns
 */
export function clearStorage() {
    clearSessionStorage();
    clearLocalStorage();
};

export const storageHelper = {
    setLocalStorage,
    getLocalStorage,
    clearLocalStorage,
    getStorageToken,
    setStorageToken,
    setSessionStorage,
    getSessionStorage,
    clearSessionStorage,
    clearStorage,
}
